FIX: Don't try to generate Gargo.lock on empty workspaces.
authorJuan Hernández <juan.hernandez.babon@gmail.com>
Wed, 14 Sep 2016 19:02:47 +0000 (15:02 -0400)
committerJuan Hernández <juan.hernandez.babon@gmail.com>
Wed, 14 Sep 2016 19:02:47 +0000 (15:02 -0400)
There was a panic! when the command `cargo update` was
executed in a workspace like this:

    mkdir ws
    cd ws
    echo '[workspace]' > Cargo.toml
    cargo new p1
    cargo new p2
    cargo update

The problem is that cargo tries to generate the Cargo.lock file
even if there aren't any members on the workspace.

This fix checks the existence of members in the workspace before trying
to do anything so at least we report an error instead of throwing a
panic!

src/cargo/core/workspace.rs
src/cargo/ops/cargo_generate_lockfile.rs
tests/workspaces.rs

index bdf00a44e8356580077d3f2abac8348abb050ce6..afa6e3bf2b101f4a2148961306b9bb84b71780b9 100644 (file)
@@ -101,7 +101,7 @@ impl<'cfg> Workspace<'cfg> {
         Ok(ws)
     }
 
-    /// Creates a "tempoarary workspace" from one package which only contains
+    /// Creates a "temporary workspace" from one package which only contains
     /// that package.
     ///
     /// This constructor will not touch the filesystem and only creates an
@@ -464,6 +464,12 @@ impl<'cfg> Packages<'cfg> {
     }
 }
 
+impl<'a, 'cfg> Members<'a, 'cfg> {
+    pub fn is_empty(self) -> bool {
+        self.count() == 0
+    }
+}
+
 impl<'a, 'cfg> Iterator for Members<'a, 'cfg> {
     type Item = &'a Package;
 
index 45ee2b10111b7a6ed9618a77ce18099c232c8a81..6a6d198b35b1c615466b5c903b92c33f6b17480f 100644 (file)
@@ -31,6 +31,10 @@ pub fn update_lockfile(ws: &Workspace, opts: &UpdateOptions)
         bail!("cannot specify both aggressive and precise simultaneously")
     }
 
+    if ws.members().is_empty() {
+        bail!("you can't generate a lockfile for an empty workspace.")
+    }
+
     let previous_resolve = match try!(ops::load_pkg_lockfile(ws)) {
         Some(resolve) => resolve,
         None => return generate_lockfile(ws),
index ab3b117fab8b887be809907bfa5ab02c5c6d9248..08be87bf4cf70924191299855fbe95b14f97a6e7 100644 (file)
@@ -940,3 +940,25 @@ fn lockfile_can_specify_nonexistant_members() {
 
     assert_that(p.cargo("build").cwd(p.root().join("a")), execs().with_status(0));
 }
+
+#[test]
+fn you_cannot_generate_lockfile_for_empty_workspaces() {
+    let p = project("foo")
+        .file("Cargo.toml", r#"
+            [workspace]
+        "#)
+        .file("bar/Cargo.toml", r#"
+            [project]
+            name = "foo"
+            version = "0.1.0"
+            authors = []
+        "#)
+        .file("bar/src/main.rs", "fn main() {}");
+    p.build();
+
+    assert_that(p.cargo("update"),
+                execs().with_status(101)
+                       .with_stderr("\
+error: you can't generate a lockfile for an empty workspace.
+"));
+}